package org.zoomdev.zoom.dao;

/**
 * 数据库配置
 */
public interface DatabaseConfig {

    /**
     * 设置表名称 ，这个在系统迁移的时候有用
     * <p>
     * 假设a系统的 A表需要迁移到 b 系统的 B表, 在b系统运行本软件，此时并不希望 b系统修改代码，则可以使用本配置，将B表的表设置（只是在本软件内部）为A
     * <p>
     * 此时
     *
     * @param databaseTableName
     * @param localTableName
     * @Table("A") 将映射到B表
     * dao.ar("A") 将映射到B表
     */
    void setTableLocalName(String databaseTableName, String localTableName);

    /**
     * 获取名称
     *
     * @param name
     * @return
     */
    String getTableLocalName(String name);

    /**
     * 默认的重命名策略
     *
     * @return
     */
    RenameStrategyFactory getColumnRenameStrategy();

    /**
     * 设置数据库字段名称重命名策略
     * 单向策略 : 只能表示从数据库字段到实体类字段名称的转变，不能描述从 实体类字段到数据库类字段的转变
     * 因为所有数据库字段的集合是一个确定值，故可以单向
     *
     * @see RenameStrategy#PREFIX_CAMERA
     * @see RenameStrategy#CAMEL
     * @see RenameStrategy#RAW
     */
    void setColumnRenameStrategy(String strategy);

    /**
     * 注册重命名策略
     *
     * @param strategy
     * @param factory
     */
    void registerColumnRenameStrategy(String strategy, RenameStrategyFactory factory);

    /**
     * 获取重命名策略
     *
     * @param strategy
     * @return
     */
    RenameStrategyFactory getColumnRenameStrategy(String strategy);


}
